package com.atguigu.commonutils;

import java.lang.reflect.Field;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 字符效验类
 * */
public class StringUtils {

    /**
     * 字符串是否合法，
     * 字符串是否 不 包含特殊字符
     * */
    public static boolean isLawful(String str){
        String regEx = "[ _`[email protected]#$%^&*()+=|{}‘:;‘,\\[\\].<>/?~！@#￥%……&*()——+|{}【】‘；：”“’。，、？]|\n|\r|\t";
        Pattern p=Pattern.compile(regEx);
        Matcher m=p.matcher(str);
        return !m.find();
    }

    /**
     * 字符串是否全为数字
     * id不用验证，如果id不正确，查数据库会报错，报 全局异常处理
     * */
    public static boolean isNum(String str){
//        return str.matches("-?[0-9]+.?[0-9]*");
        //+表示1个或多个（如"3"或"225"），*表示0个或多个（[0-9]*）（如""或"1"或"22"），?表示0个或1个([0-9]?)(如""或"7")
        return str.matches("[0-9]+");
    }

    /**
     * 判断对象的字符串类型的属性的值是否合法，无法验证子对象
     * */
    public static boolean objIsLawful(Object obj) throws IllegalAccessException {
        Field[] fields=obj.getClass().getDeclaredFields();//获取对象的所有属性
        for (Field field : fields){
            field.setAccessible(true);//设置允许通过反射访问私有属性
            String type=field.getGenericType().toString();//获取属性的类型，并转换为字符串
            if (type.equals("class java.lang.String")){//是否时String类型
                Object valObj=field.get(obj);//获取属性的值
                if (valObj!=null){//判断属性的值是否不为空
                    String value=valObj.toString();//获取属性的值转换为字符串
                    if (!isLawful(value)){//判断值是否不合法，不合法返回false
                        return false;
                    }
                }
            }
        }
        return true;
    }

}
